from django.http import JsonResponse
from django.views import View
# from .serializer import product_serializer
from .serializers import ProductModelSerializer
from product.models import Product
import json
from django.shortcuts import get_object_or_404
# url: /products/  GET  POST
# url: /products/<int:pk>  GET  PUT  DELETE
# Create your views here.
class ProductsView(View):  # 列表页
    """
    商品列表 Models.objects.all()
    商品添加  Models.objects.create()
    """
    def get(self, request):
        # 获取所有的商品数据
        products = Product.objects.all()
                
        # 把商品数据传递给序列化函数进行序列化
        # 序列化函数的作用：把模型对象转换为字典列表
        # ser = product_serializer(products)    
        ser = ProductModelSerializer(products, many=True)
            
        data = {
            "message": "商品列表获取成功",
            "data":ser.data
        }
        return JsonResponse(data=data, safe=False)         
    
    def post(self, request):
        # 商品添加
        # 1.获取前端传来的数据
        # 把json数据转换为python字典(反序列化)
        dict_data = json.loads(request.body)
        ser = ProductModelSerializer(data=dict_data)
        print(ser)
        
        # 2.把数据保存到数据库中
        if ser.is_valid(): 
            product = ser.save()  # 保存数据  注意：save()方法会返回一个对象实例 
            # 将保存成功的数据返回给前端
            data = {
                'message': '商品添加成功',
                'data':ProductModelSerializer(product).data
                }
            
            # 3.返回响应
            return JsonResponse(data=data,status=200)  # 商品添加成功的响应
        else:
            # 3.返回响应
            return JsonResponse(data=ser.errors,status=400)  # 商品添加失败的响应
        
    
class ProductDetailView(View):  # 详情页
    """
    详情 id
    修改 id
    删除 id
    """
    def get(self, request,pk):
        # 获取商品详情 get
        # try:
        #     product = Product.objects.get(pk=pk)
        #     # 当前的product是一个对象实例，不需要迭代器
        #     dic_data = {
                    
        #             "id":product.id,  # 商品id  "id":1
        #             "name":product.product_name,  # 商品名称
        #             "cover":f"http://127.0.0.1:8000{product.cover.url}" if product.cover else None,  # 商品封面  注意：图片路径需要使用url属性获取  "cover":"/media/images/1.jpg"
        #             "price":product.price,  # 商品价格
        #             "popularity":product.popularity,  # 商品热度
        #             "stock":product.stock,  # 商品库存
        #             "is_active":product.is_active,  # 商品状态                
        #         }
        #     data = {
        #             "message": "商品详情获取成功",
        #             "data":dic_data,
                    
        #     }
        #     return JsonResponse(data=data, safe=False,status=200)  # 商品详情的响应  safe=Fals
        
        # except Product.DoesNotExist:  # 商品不存在的情况
        #     return JsonResponse({'message': '商品不存在'}, status=404)
        #-------------------------------------------------------------------------
        # 优化代码
        product = get_object_or_404(Product, pk=pk)  # 商品不存在的情况
        # 指定序列化的模型
        ser = ProductModelSerializer(product)
                
        data = {
            "message": "商品详情获取成功",
            "data":ser.data
            }
        return JsonResponse(data=data,safe=False,status=200)  # 商品详情的响应  safe=Fals      
                
    
    def put(self, request,pk):
        """
        1.获取pk
        2.获取前端传来的数据
        3.根据pk获取商品对象
        4.更新数据
        5.保存数据
        6.返回响应
        """
        product = Product.objects.get(pk=pk) 
        # 1.获取前端传来的数据
        # 把json数据转换为python字典(反序列化)
        json_data = json.loads(request.body)
        name = json_data.get('name', '')  # 商品名称
        cover = json_data.get('cover', '')  # 商品封面
        price = json_data.get('price', '')  # 商品价格
        
        stock = json_data.get('stock', '')  # 商品库存
        is_active = json_data.get('is_active', False)  # 商品状态
        # 2.更新数据
        product.product_name = name  # 商品名称
        product.cover = cover  # 商品封面
        product.price = price  # 商品价格
        product.stock = stock  # 商品库存
        product.is_active = is_active  # 商品状态
        # 3.保存数据
        product.save()
        # 4.返回响应
        return JsonResponse({'message': '商品修改成功'})
    
    
    def delete(self, request,pk):
        """
        1.获取pk
        2.根据pk获取对应的数据
        3.删除数据
        4.返回响应
        """
        Product.objects.get(pk=pk).delete()
        return JsonResponse({})
    
        